好的,我們繼續利用上一篇文章建立的csv資料及來進行訓練,
首先我們建立一個功能來幫助從字串提取特徵:
strcount.py
# -*- coding:utf8 -*-
import string
import numpy as np
def str_count(s,mode):
count_en = count_dg = count_sp = count_zh = count_pu = count_low=0
s_len = len(s)
for c in s:
# 英文
if c in string.ascii_letters:
count_en += 1
#小寫
if c.islower():
count_low+=1
# 數字
elif c.isdigit():
count_dg += 1
# 空格
elif c.isspace():
count_sp += 1
# 非英文其他字元
elif c.isalpha():
count_zh += 1
# 特殊字符
else:
count_pu += 1
if mode == 'dict':
rtn_dict ={'total':s_len, 'zh':count_zh ,'en':count_en ,'digit':count_dg,'punc':count_pu}
return rtn_dict
elif mode == 'numpy' :
rtn_np = np.array([[count_en,count_dg,count_pu,count_zh]], dtype=object)
return rtn_np
else:
return NONE
因次這裡我以一個字串有多少英文字(程式中能區分大小寫)、特殊字元、
中文字(目前程式是計算排除了英文的其他字元)、
數字、空格(上一篇前處理已經排除,所以回傳沒有列入)。
create_model.py
import pandas as pd
from strcount import str_count
from sklearn import preprocessing
from sklearn import tree
from joblib import dump, load
df = pd.read_csv('train.csv')
le = preprocessing.LabelEncoder()
df['label'] = le.fit_transform(df['label'])
# print(df.head())
enList=[]
digList=[]
puncList=[]
zhList=[]
for cont_str in df["content"]:
count_dict= str_count(cont_str,'dict')
# print(count_dict)
enList.append(count_dict['en'])
digList.append(count_dict['digit'])
puncList.append(count_dict['punc'])
zhList.append(count_dict['zh'])
df['en'] = enList
df['digit'] = digList
df['punc'] = puncList
df['zh'] = zhList
print(df.head())
X = df.iloc[:, 2:]
y = df.iloc[:, 1]
decision_tree = tree.DecisionTreeClassifier(criterion='gini')
decision_tree.fit(X, y)
再來引入套件(pandas、sklearn、上面寫的strcount、joblib)
我們把每個類別使用LabelEncoder這個功能 mapping 到某個數值。
將特徵數值加入到新的欄位中。
使用pandas分隔特徵(X)與標籤(Y),
使用決策樹演算法來擬合訓練。
測試模型是否能正常預測。
print(le.inverse_transform(decision_tree.predict([(10,0,5,3)])))
順邊查看類別對應的數值。
print(le.inverse_transform([0]))
print(le.inverse_transform([1]))
print(le.inverse_transform([2]))
print(le.inverse_transform([3]))
print(le.inverse_transform([4]))
print(le.inverse_transform([5]))
print(le.inverse_transform([6]))
print(le.inverse_transform([7]))
print(le.inverse_transform([8]))
我們用joblib套件將模型儲存成joblib物件。
dump(decision_tree, 'tree.joblib')
未來使用:
load_model.py
import os
import pymongo
# import openpyxl
from strcount import str_count
import pandas as pd
from joblib import dump, load
import io
from sklearn import preprocessing
label_convert_dict = {0:'address',1:'company',2:'contact_info',3:'email',4:'line',5:'name',6:'position',7:'tax',8:'unknown'}
clf = load('tree.joblib')
count=str_count('蘇韋文',mode='numpy')
print(count)
my_prediction = clf.predict(count)
print(my_prediction[0])
predict_answer = my_prediction[0]
print(label_convert_dict[predict_answer])
可以使用一個字典來對應預測數值與答案,
載入模型進行預測答案。
我建立的模型是有可能無法區別職務以及姓名的,
所以可以多加一些字串規則或是使用正規表達式來進一步篩選與分類,
幫助未來預測上的表現。
至於用哪一種演算法,
也可以把決策樹更換為KNN或是SVM測試看看哪一種效果比較好,
差異並沒有很大。